#ifndef NAIVECONVOLUTION_H
#define NAIVECONVOLUTION_H

#ifndef OPENCVSTL
#define OPENCVSTL
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
#endif

/**
 * Metodo che esegue la convoluzione di un'immagine con un kernel di qualsiasi tipo
 * seguendo la definizione di convoluzione, cioe' senza ottimizzazioni
 * 
 * @param imgIn immagine originale
 * @param imgOut immagine risultante
 * @param kernel kernel da applicare
 */
void naiveConvolution(const Mat_<uchar>& imgIn , Mat_<uchar>& imgOut,const Mat_<float>& kernel);
void naiveConvWithPointers(uchar* imgIn , int img_rows, int img_cols, uchar* imgOut,float* kernel, int kern_rows, int kern_cols);
/**
 * Metodo che esegue la convoluzione di un'immagine con un kernel di qualsiasi tipo
 * seguendo la definizione di convoluzione, ma utilizzando i puntatori per l'accesso ai dati
 * 
 * @param imgIn immagine originale
 * @param imgOut immagine risultante
 * @param kernel kernel da applicare
 */
void naiveConvWithPointers(Mat_<uchar> imgIn , Mat_<uchar>& imgOut,Mat_<float> kernel);
int testNaiveConvolution();
#endif // NAIVECONVOLUTION_H
